package com.example.domain.dto.order;

import com.example.domain.dto.MoneyDTO;
import com.example.domain.dto.QuantityDTO;
import com.example.domain.entity.OrderItem;
import com.example.domain.valueobject.Money;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

/**
 * 订单商品项DTO
 * 
 * <p><strong>注意：订单功能暂未开发，此DTO暂时未使用</strong></p>
 * 
 * @author Means
 * @since 2025-10-27
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OrderItemDTO {
    
    /**
     * 订单项ID
     */
    private String id;
    
    /**
     * 订单ID
     */
    private String orderId;
    
    /**
     * 商品ID
     */
    private String productId;
    
    /**
     * 商品名称（冗余字段，需要关联查询填充）
     */
    private String productName;
    
    /**
     * 数量
     */
    private QuantityDTO quantity;
    
    /**
     * 单价（购买时的价格）
     */
    private MoneyDTO unitPrice;
    
    /**
     * 原价（划线价）
     */
    private MoneyDTO originalPrice;
    
    /**
     * 小计（数量 × 单价）
     */
    private MoneyDTO subtotal;
    
    /**
     * 折扣金额
     */
    private MoneyDTO discount;
    
    /**
     * 折扣描述
     */
    private String discountDesc;
    
    /**
     * 应付金额
     */
    private MoneyDTO total;
    
    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createdAt;
    
    /**
     * 从实体类创建DTO（基础版本，不包含关联信息）
     * 
     * @param item 订单商品项实体
     * @return OrderItemDTO
     */
    public static OrderItemDTO from(OrderItem item) {
        if (item == null) {
            return null;
        }
        
        return OrderItemDTO.builder()
                .id(item.getId())
                .orderId(item.getOrderId())
                .productId(item.getProductId())
                .quantity(QuantityDTO.builder()
                        .value(item.getQuantityValue())
                        .unit(item.getQuantityUnit())
                        .build())
                .unitPrice(item.getUnitPrice() != null ? MoneyDTO.from(Money.of(item.getUnitPrice())) : null)
                .subtotal(item.getLineBeforeDiscount() != null ? MoneyDTO.from(Money.of(item.getLineBeforeDiscount())) : null)
                .total(item.getLineAfterDiscount() != null ? MoneyDTO.from(Money.of(item.getLineAfterDiscount())) : null)
                .createdAt(item.getCreatedAt())
                .build();
    }
}

